package com.ruoyi.file.utils;

import com.ruoyi.common.utils.StringUtils;

import java.util.Arrays;
import java.util.List;

/**
 * 文件类型处理工具类
 * 统一处理文件类型相关的逻辑
 *
 * @author ruoyi
 */
public class FileTypeUtils {

    /**
     * 解析允许的文件类型字符串为列表
     *
     * @param allowedFileTypes 允许的文件类型（逗号分隔）
     * @return 文件类型列表，如果为空则返回null
     */
    public static List<String> parseAllowedTypes(String allowedFileTypes) {
        if (StringUtils.isBlank(allowedFileTypes)) {
            return null;
        }
        return Arrays.asList(allowedFileTypes.split(","));
    }

    /**
     * 检查文件类型是否被允许
     *
     * @param fileName         文件名
     * @param allowedFileTypes 允许的文件类型（逗号分隔）
     * @return true表示允许，false表示不允许
     */
    public static boolean isFileTypeAllowed(String fileName, String allowedFileTypes) {
        if (StringUtils.isBlank(allowedFileTypes) || StringUtils.isBlank(fileName)) {
            return true; // 如果没有限制或文件名为空，则允许
        }

        List<String> allowedTypes = parseAllowedTypes(allowedFileTypes);
        return allowedTypes.stream()
                .anyMatch(type -> fileName.toLowerCase().endsWith(type.toLowerCase().trim()));
    }

    /**
     * 获取文件扩展名（包含点号）
     *
     * @param fileName 文件名
     * @return 文件扩展名，如 .txt
     */
    public static String getFileExtension(String fileName) {
        if (StringUtils.isBlank(fileName)) {
            return "";
        }

        int lastDotIndex = fileName.lastIndexOf('.');
        if (lastDotIndex > 0 && lastDotIndex < fileName.length() - 1) {
            return fileName.substring(lastDotIndex);
        }

        return "";
    }

    /**
     * 获取不含扩展名的文件名
     *
     * @param fileName 文件名
     * @return 不含扩展名的文件名
     */
    public static String getFileNameWithoutExtension(String fileName) {
        if (StringUtils.isBlank(fileName)) {
            return "";
        }

        int lastDotIndex = fileName.lastIndexOf('.');
        if (lastDotIndex > 0) {
            return fileName.substring(0, lastDotIndex);
        }

        return fileName;
    }

    /**
     * 检查是否为图片文件
     *
     * @param fileName 文件名
     * @return true表示是图片文件
     */
    public static boolean isImageFile(String fileName) {
        String extension = getFileExtension(fileName).toLowerCase();
        return Arrays.asList(".jpg", ".jpeg", ".png", ".gif", ".bmp", ".webp", ".svg").contains(extension);
    }

    /**
     * 检查是否为视频文件
     *
     * @param fileName 文件名
     * @return true表示是视频文件
     */
    public static boolean isVideoFile(String fileName) {
        String extension = getFileExtension(fileName).toLowerCase();
        return Arrays.asList(".mp4", ".avi", ".mkv", ".mov", ".wmv", ".flv", ".webm").contains(extension);
    }

    /**
     * 检查是否为音频文件
     *
     * @param fileName 文件名
     * @return true表示是音频文件
     */
    public static boolean isAudioFile(String fileName) {
        String extension = getFileExtension(fileName).toLowerCase();
        return Arrays.asList(".mp3", ".wav", ".flac", ".aac", ".ogg", ".wma").contains(extension);
    }

    /**
     * 检查是否为文档文件
     *
     * @param fileName 文件名
     * @return true表示是文档文件
     */
    public static boolean isDocumentFile(String fileName) {
        String extension = getFileExtension(fileName).toLowerCase();
        return Arrays.asList(".pdf", ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".txt").contains(extension);
    }
}
